package com.itheima.reggie.filter;


import com.alibaba.fastjson.JSONObject;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
//添加filter专用注解 webfilter   (filtername  &  urlpatterns)
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    // 实现filer接口后重写方法
    // 创建antpathmatcher路径解析器的常量对象
    private static final AntPathMatcher ANT_PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        //  使用强转 把请求和响应转为http协议下的请求和响应
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 获取经过过滤的所有路径,请求的getRequestURI方法并toString()
        String currentURI = request.getRequestURI().toString();
        log.info("拦截到了{}", currentURI);
        // 使用字符串的contains方法,参数传入允许放行的字段登录(/login)
        //  因为放行的路径太多,contains方法不够需求,使用AntPathMatcher进行解析
        String[] urls = {
                "/employee/login",
                "/employee/logout"
                , "/backend/**"
                , "/front/**",
                "/user/**"
        };
        for (String url : urls) {
            boolean match = ANT_PATH_MATCHER.match(url, currentURI);
            if (match) {
                // 判断字段是否存在,存在使用chain中的dofilter方法放行 把强转后的请求和响应传入参数
                // 放行后结束方法
                chain.doFilter(request,response);
                return;
            }
        }

        // 使用请求中的方法获取session
        Object id = request.getSession().getAttribute("employee");
        if (id != null){
            log.info("用户已登录");
            // 已经登录了,就可以获取id了
            BaseContext.setCurrentId((Long) id);
            // 开始判定
            //  如果不是null ,放行
            chain.doFilter(request,response);
            return;
        }
        //4-2、判断登录状态，如果已登录，则直接放行
        if(request.getSession().getAttribute("userId") != null){
            log.info("用户已登录，用户id为：{}",request.getSession().getAttribute("userId"));

            Long userId = (Long) request.getSession().getAttribute("userId");
            BaseContext.setCurrentId(userId);

            chain.doFilter(request,response);
            return;
        }

        // 未登录就返回未登录结果并拦截
        log.info("用户未登录");
        //  Result的错误星系为:NOT_LOGIN  返回的响应数据要用json  JSONObject.toJSONString(Result)
        R<Object> r = R.error("NOTLOGIN");
        String s = JSONObject.toJSONString(r);
        //  用response的getwriter.write(s) 传送  并return;
        response.getWriter().write(s);

    }

}
